package cn.biplam.common.wrapper.treeFlat.flat.callback;

import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.Result;


/**
 * 业务数据比较回调类
 * @author 	WangSong 2009-11-5 下午01:58:02
 * @version 1.0
 */
public class CompareCallback {
	
		/** 比较值 */
		private String compareValue;
		/** 比较类型 */
		private Compare_Type type;
		/** 字段名称 */
		private String fieldName;
		
		/**
		 * 比较类型
		 */
		public enum Compare_Type{
			/**字符串等于 */
			Equal,
			/**数据串包含比较字符串 */
			In,
			/**对数据字符串做正则表达式匹配 */
			Regular;
		}
		
		/**
		 * 构造方法
		 * @param compareValue	比较操作字符串(比较值/比较表达式)
		 * @param fieldName     比较条件字段名称
		 * @param type			比较类型
		 */
		public CompareCallback(String compareValue,
				String fieldName,
				Compare_Type type){
			this.init(compareValue, fieldName, type);
		}

		/**
		 * 构造方法
		 * @param compareValue	比较操作字符串(比较值/比较表达式)
		 * @param fieldName     比较条件字段名称
		 * @param type			比较类型
		 * @throws ErrorMessage 
		 * @deprecated
		 */
		public CompareCallback(String compareValue,
				String fieldName,
				String type) throws ErrorMessage{
			Compare_Type cType;
			if(type.equals(Compare_Type.Equal)){
				cType=Compare_Type.Equal;
			}else if(type.equals(Compare_Type.In)){
				cType=Compare_Type.In;
			}else if(type.equals(Compare_Type.Regular)){
				cType=Compare_Type.Regular;
			}else{
				throw new ErrorMessage("Unknow Compare Type.");
			}
			this.init(compareValue, fieldName, cType);
		}
		
		/**
		 * 执行判断,返回True/False 
		 * @param result	 数据集
		 * @return	boolean
		 * @throws ErrorMessage 
		 */
		public boolean get(Result result) throws ErrorMessage{
			//获取被比较字段的值
			String value = result.getString(this.fieldName);
			//执行比较
			return get(value);
		}
		
		/**
		 * 执行判断,返回True/False 
		 * @param value		数据字符串
		 * @return	boolean
		 */
		public boolean get(String value){
			switch(this.type){
			case Equal:
				return this.getEqual(value);
			case In:
				return this.getIn(value);
			case Regular:
				return this.getRegular(value);
			default:
				return false;
			}
		}
		
		
		private boolean getEqual(String value){
			if(compareValue==null){
				return value == null;
			}
			return compareValue.equals(value);
		}
		
		private boolean getIn(String compare){
			return compareValue.indexOf(compare)>0;
		}
		
		private boolean getRegular(String compare){
			return compareValue.matches(compare);
		}
		
		private void init(String compareValue,
				String fieldName,
				Compare_Type type){
			this.compareValue=compareValue;
			this.fieldName = fieldName;
			this.type=type;
		}
		
	}
